#!/bin/sh

exec 1>>"/Users/Shared/startClient.log" 2>&1
echo "startClient called"

function testStringIsInteger() {
STR=$1
X=`echo "$STR" | awk '$0 ~/[^0-9]/ { print "NOT_NUMBER" }'`

if [ "$STR" != "" ] && [ "$X" != "NOT_NUMBER" ]; then
    exit 0
else
    exit 1
fi
}
function testStringIsNOTInteger() {
STR=$1
X=`echo "$STR" | awk '$0 ~/[^0-9]/ { print "NOT_NUMBER" }'`

if [ "$STR" != "" ] && [ "$X" != "NOT_NUMBER" ]; then
    exit 1
else
    exit 0
fi
}
function testIsCurrentVersionOlderThanSharedVersion() {
# return value: 0 - shared one is newer
#               1 - local one is newer
    SHAREDVERSION=$1
    CURRENTVERSION=$2
    CURRENTVERSIONSTRINGARRAY=( ${CURRENTVERSION//./ } )
    SHAREDVERSIONSTRINGARRAY=( ${SHAREDVERSION//./ } )

    if [ ${SHAREDVERSIONSTRINGARRAY[0]} -gt ${CURRENTVERSIONSTRINGARRAY[0]} ]; then
        return 0
    else
        if [ ${SHAREDVERSIONSTRINGARRAY[0]} -eq ${CURRENTVERSIONSTRINGARRAY[0]} ]; then
            if [ ${SHAREDVERSIONSTRINGARRAY[1]} -gt ${CURRENTVERSIONSTRINGARRAY[1]} ]; then
                return 0
            else
                if [ ${SHAREDVERSIONSTRINGARRAY[1]} -eq ${CURRENTVERSIONSTRINGARRAY[1]} ]; then
                    if [ ${SHAREDVERSIONSTRINGARRAY[2]} -gt ${CURRENTVERSIONSTRINGARRAY[2]} ]; then
                        return 0
                    else
                        if [ ${SHAREDVERSIONSTRINGARRAY[2]} -eq ${CURRENTVERSIONSTRINGARRAY[2]} ]; then
                            if [ ${SHAREDVERSIONSTRINGARRAY[3]} -gt ${CURRENTVERSIONSTRINGARRAY[3]} ]; then
                                return 0
                            fi
                            if [ ${SHAREDVERSIONSTRINGARRAY[3]} -eq ${CURRENTVERSIONSTRINGARRAY[3]} ]; then
                                return 0
                            fi
                        fi
                    fi
                fi
            fi
        fi
    fi
#    echo "local one is newer - return 1"
    return 1
}

function getStringTillEndDots() {
    INPUTSTRING="$1"
    OUTPUTSTRING=""
    for (( i = 0 ; i < ${#INPUTSTRING} ; i++ )) do
        if [ "${INPUTSTRING:$i:2}" != ".." ]; then
            OUTPUTSTRING="${OUTPUTSTRING}${INPUTSTRING:$i:1}"
        else
            break
        fi
    done
    echo "$OUTPUTSTRING"
}
function getParameter() {
    LINE="$1"
    PARAMETERID=${LINE:0:3} # extract first 3 char
    PARAMETERSTRING=""
    if [ "$PARAMETERID" == ".c." ] || [ "$PARAMETERID" == ".C." ]; then
        # wir haben eine session id - commit "--connectTo <ID>"
        SESSIONIDWITHDOT=${LINE:3:${#LINE}}
        SESSIONID=$(getStringTillEndDots "$SESSIONIDWITHDOT")
        PARAMETERSTRING="${PARAMETERSTRING} --connectTo ${SESSIONID}"
    fi
    if [ "$PARAMETERID" == ".g." ] || [ "$PARAMETERID" == ".G." ]; then
        GATEWAYWITHENDDOTS=${LINE:3:${#LINE}}
        GATEWAY=$(getStringTillEndDots "$GATEWAYWITHENDDOTS")
        PARAMETERSTRING="${PARAMETERSTRING} --gateway ${GATEWAY}"
    fi
    if [ "$PARAMETERID" == ".s." ] || [ "$PARAMETERID" == ".S." ]; then
        STARTMODEWITHENDDOTS=${LINE:3:${#LINE}}
        STARTMODE=$(getStringTillEndDots "$STARTMODEWITHENDDOTS")
        PARAMETERSTRING="${PARAMETERSTRING} --StartMode ${STARTMODE}"
    fi
    echo "$PARAMETERSTRING"
}

function parseParameterString() {
    INPUTSTRING="$1"
    TMPSTRING=""
    ONEPARAMETER=""
    ALLPARAMETERS=""
    for (( i = 0 ; i < ${#INPUTSTRING} ; i++ )) do
        if [ "${INPUTSTRING:$i:2}" != ".." ]; then
            TMPSTRING="${TMPSTRING}${INPUTSTRING:$i:1}"
        else
            # append the end-dots
            TMPSTRING="${TMPSTRING}${INPUTSTRING:$i:2}"
            ONEPARAMETER=$(getParameter "$TMPSTRING")
            ALLPARAMETERS="${ALLPARAMETERS}${ONEPARAMETER}"
            i=$((i + 1))
            TMPSTRING=""
            ONEPARAMETER=""
        fi
    done
    echo "$ALLPARAMETERS"
}

function extractSettingsFromString() {
    BUNDLENAME=$1
    # remove the last 4 characters '.app'
    BUNDLENAME=$(echo ${BUNDLENAME} | rev | cut -c 5- | rev)
#    echo "our installer without ending: $LASTSTRING"
    DONE=false
    CODEDPARAMETERSTRING="${BUNDLENAME}"
    until $DONE ; do
        CODEDPARAMETERSTRING=${CODEDPARAMETERSTRING#*.}
        if [[ "${CODEDPARAMETERSTRING}" != *"."* ]]; then # break if no more '.' is in this string
            DONE=true
        fi
        # check if first 2 characters match a parameter
        if [ "${CODEDPARAMETERSTRING:0:2}" == "c." ]; then
            DONE=true
        fi
        if [ "${CODEDPARAMETERSTRING:0:2}" == "g." ]; then
            DONE=true
        fi
        if [ "${CODEDPARAMETERSTRING:0:2}" == "s." ]; then
            DONE=true
        fi
    done
    CODEDPARAMETERSTRING=".${CODEDPARAMETERSTRING}"
#    echo "the coded parameters: $CODEDPARAMETERSTRING"
    ALLPARAMETERSSTRING=$(parseParameterString "$CODEDPARAMETERSTRING")
    echo "$ALLPARAMETERSSTRING"
}

function extractSettingsFromParentDirString() {
    PARENTDIR=$1
    DONE=false
    CODEDPARAMETERSTRING="${PARENTDIR}"
    until $DONE ; do
        CODEDPARAMETERSTRING=${CODEDPARAMETERSTRING#*.}
        if [[ "${CODEDPARAMETERSTRING}" != *"."* ]]; then # break if no more '.' is in this string
            DONE=true
        fi
        # check if first 2 characters match a parameter
        if [ "${CODEDPARAMETERSTRING:0:2}" == "c." ]; then
            DONE=true
        fi
        if [ "${CODEDPARAMETERSTRING:0:2}" == "g." ]; then
            DONE=true
        fi
    done
    CODEDPARAMETERSTRING=".${CODEDPARAMETERSTRING}"
#    echo "the coded parameters: $CODEDPARAMETERSTRING"
    ALLPARAMETERSSTRING=$(parseParameterString "$CODEDPARAMETERSTRING")
    echo "$ALLPARAMETERSSTRING"
}

function replaceHexCodeOfDotWithDot() {
    INPUTSTRING="$1"
    RETURNSTRING=""
    for (( i = 0 ; i < ${#INPUTSTRING}; i++ )) do
        TMPSTRING="${INPUTSTRING:$i:3}"
        if [[ "$TMPSTRING" == "x2e" ]]; then
            RETURNSTRING="${RETURNSTRING}."
            i=$i+2
        else
            RETURNSTRING="${RETURNSTRING}${INPUTSTRING:$i:1}"
        fi
    done
    echo "$RETURNSTRING"
}

BASEDIR=$(cd "$(dirname "$0")"; pwd)
echo "base dir: $BASEDIR"
APPBUNDLENAME=`dirname "${BASEDIR}"`
APPBUNDLENAME=`dirname "${APPBUNDLENAME}"`
PARENTDIRNAME=`dirname "${APPBUNDLENAME}"`

APPBUNDLENAME=`basename "${APPBUNDLENAME}"`
PARENTDIRNAME=`basename "${PARENTDIRNAME}"`
echo "app bundle name: $APPBUNDLENAME"
echo "parent dir name: $PARENTDIRNAME"
REPOSITORYROOT="/Users/Shared/pcvisit software ag/caloa/pcvisit.Support.guest/release/"
#REPOSITORYROOT="/Users/Shared/pcvisit software ag/"
STARTPARAMETER=""
ALLARGUMENTS="$@"
MODULNAME="pcvisit_client"

MAXVERSIONNUMBER="0"
MAXMAJOR="0"
MAXMINOR="0"
MAXBUILDNUMBER="0"

mkdir -p "$REPOSITORYROOT"
chmod 777 "/Users/Shared/pcvisit software ag"
chmod 777 "/Users/Shared/pcvisit software ag/caloa"
chmod 777 "$REPOSITORYROOT"
cd "$REPOSITORYROOT"
DIRS=`ls -l $MYDIR | egrep '^d' | awk '{print $9}'`

for directory in $DIRS
do
    # parse version string (the directory name)
    VERSIONSTRINGARRAY=( ${directory//./ } )
    SIZE=${#VERSIONSTRINGARRAY[@]}
    if [ $SIZE -ne 4 ]; then
        continue
    fi
    VERSIONNUMBER=${VERSIONSTRINGARRAY[0]}
    MAJOR=${VERSIONSTRINGARRAY[1]}
    MINOR=${VERSIONSTRINGARRAY[2]}
    BUILDNUMBER=${VERSIONSTRINGARRAY[3]}
    #echo $BUILDNUMBER
    if ( testStringIsNOTInteger ${VERSIONNUMBER} ); then
        continue
    fi
    if ( testStringIsNOTInteger ${MAJOR} ); then
        continue
    fi
    if ( testStringIsNOTInteger ${MINOR} ); then
        continue
    fi
    if ( testStringIsNOTInteger ${BUILDNUMBER} ); then
        continue
    fi
    # test if this version is newer
    if [ $VERSIONNUMBER -eq $MAXVERSIONNUMBER ]; then
        if [ $MAJOR -eq $MAXMAJOR ]; then
            if [ $MINOR -eq $MAXMINOR ]; then
                if [ $BUILDNUMBER -gt $MAXBUILDNUMBER ]; then
                    MAXBUILDNUMBER=$BUILDNUMBER
                fi
            else
                if [ $MINOR -gt $MAXMINOR ]; then
                    MAXMINOR=$MINOR
                    MAXBUILDNUMBER=$BUILDNUMBER
                fi
            fi
        else
            if [ $MAJOR -gt $MAXMAJOR ]; then
                MAXMAJOR=$MAJOR
                MAXMINOR=$MINOR
                MAXBUILDNUMBER=$BUILDNUMBER
            fi
        fi
    else
        if [ $VERSIONNUMBER -gt $MAXVERSIONNUMBER ]; then
            MAXVERSIONNUMBER=$VERSIONNUMBER
            MAXMAJOR=$MAJOR
            MAXMINOR=$MINOR
            MAXBUILDNUMBER=$BUILDNUMBER
        fi
    fi
done
LATESTVERSION="${MAXVERSIONNUMBER}.${MAXMAJOR}.${MAXMINOR}.${MAXBUILDNUMBER}"
#echo "aktuelle Version: ${LATESTVERSION}"

# get version info from plist file
LOCALVERSIONNUMBER=`/usr/libexec/PlistBuddy -c "print :CFBundleShortVersionString" "${BASEDIR}/../Info.plist"`
LOCALBUILDNUMBER=`/usr/libexec/PlistBuddy -c "print :CFBundleVersion" "${BASEDIR}/../Info.plist"`

#if version in current directory is older, start shared version; else, copy local one into shared directory and start it
testIsCurrentVersionOlderThanSharedVersion "${LATESTVERSION}" "${LOCALVERSIONNUMBER}.${LOCALBUILDNUMBER}"
retval=$?
if [ "$retval" == 0 ]; then
    echo "start shared program"
    echo "path: ${REPOSITORYROOT}/${LATESTVERSION}/${MODULNAME}.app/Contents/MacOS/pcvisit_client ${STARTPARAMETER} ${ALLARGUMENTS}"
    if [[ $ALLARGUMENTS == *"--autostart"* ]]; then
        "${REPOSITORYROOT}/${LATESTVERSION}/${MODULNAME}.app"/Contents/MacOS/pcvisit_client ${STARTPARAMETER} ${ALLARGUMENTS//--autostart/} --startBundle
    else
        nohup sh -c "sleep 2; open \"${REPOSITORYROOT}/${LATESTVERSION}/${MODULNAME}.app\" --args ${STARTPARAMETER} ${ALLARGUMENTS} --startBundle" > /dev/null 2>&1 &
    fi
else
    # copy local bundle into shared directory
    echo "copy program to '${REPOSITORYROOT}/${LOCALVERSIONNUMBER}.${LOCALBUILDNUMBER}/${MODULNAME}.app'"
    mkdir -p "${REPOSITORYROOT}/${LOCALVERSIONNUMBER}.${LOCALBUILDNUMBER}/"
    cp -Rf "$BASEDIR/../../" "${REPOSITORYROOT}/${LOCALVERSIONNUMBER}.${LOCALBUILDNUMBER}/${MODULNAME}.app"

    STARTPARAMETER=$(extractSettingsFromString "$APPBUNDLENAME")
    if [ "$STARTPARAMETER" == "" ]; then
        # try parsing the parent dir name
        PARENTDIRNAME=$(replaceHexCodeOfDotWithDot "$PARENTDIRNAME")
        STARTPARAMETER=$(extractSettingsFromParentDirString "$PARENTDIRNAME")

        if [ -f "${BASEDIR}/../Resources/customization" ]; then
            value=$(<"${BASEDIR}/../Resources/customization")
            echo "$value"
            STARTPARAMETER=$(extractSettingsFromParentDirString "$value")
        fi
    fi
    echo "start copied program"
    if [[ $ALLARGUMENTS == *"--autostart"* ]]; then
        echo "- autostart: pass args: '${STARTPARAMETER} ${ALLARGUMENTS//--autostart/} --startBundle'"
        "${REPOSITORYROOT}/${LOCALVERSIONNUMBER}.${LOCALBUILDNUMBER}/${MODULNAME}.app"/Contents/MacOS/pcvisit_client ${STARTPARAMETER} ${ALLARGUMENTS//--autostart/} --startBundle
    else
        echo "- nohup, open: pass args: '${STARTPARAMETER} ${ALLARGUMENTS} --startBundle'"
        #nohup sh -c "sleep 2; open -n \"${REPOSITORYROOT}/${LOCALVERSIONNUMBER}.${LOCALBUILDNUMBER}/${MODULNAME}.app\" --args ${STARTPARAMETER} ${ALLARGUMENTS} --startBundle" > /dev/null 2>&1 &
        nohup sh -c "sleep 2; \"${REPOSITORYROOT}/${LOCALVERSIONNUMBER}.${LOCALBUILDNUMBER}/${MODULNAME}.app\"/Contents/MacOS/pcvisit_client ${STARTPARAMETER} ${ALLARGUMENTS} --startBundle" > /dev/null 2>&1 &
    fi
fi

cd "$BASEDIR"

exit 0
